// serialportwrapper.h
#ifndef SERIALPORTWRAPPER_H
#define SERIALPORTWRAPPER_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>

class SerialPortWrapper : public QObject
{
    Q_OBJECT
public:
    // 串口配置结构体
    struct PortConfig
    {
        qint32 baudRate = QSerialPort::Baud9600;
        QSerialPort::DataBits dataBits = QSerialPort::Data8;
        QSerialPort::Parity parity = QSerialPort::NoParity;
        QSerialPort::StopBits stopBits = QSerialPort::OneStop;
        QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl;

        PortConfig(qint32 baudRate = QSerialPort::Baud9600,
                   QSerialPort::DataBits dataBits = QSerialPort::Data8,
                   QSerialPort::Parity parity = QSerialPort::NoParity,
                   QSerialPort::StopBits stopBits = QSerialPort::OneStop,
                   QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl)
            : baudRate(baudRate)
            , dataBits(dataBits)
            , parity(parity)
            , stopBits(stopBits)
            , flowControl(flowControl)
        {}
    };

    explicit SerialPortWrapper(QObject *parent = nullptr);
    ~SerialPortWrapper();

    // 获取可用串口列表
    QList<QSerialPortInfo> availablePorts() const;

    // 打开串口
    bool openPort(const QString &portName, const PortConfig &config);
    void closePort();

    // 检查串口是否打开
    bool isOpen() const;

    // 发送数据
    qint64 writeData(const QByteArray &data);

    // 自动检测可用串口（定时刷新）
    void enableAutoDetect(bool enable, int interval = 2000);

signals:
    // 数据接收信号
    void dataReceived(const QByteArray &data);
    // 错误信号
    void errorOccurred(const QString &errorString);
    // 端口列表更新信号
    void portsListUpdated();

public slots:
    // 读取数据
    void readData();

private slots:
    void handleError(QSerialPort::SerialPortError error);
    void checkAvailablePorts();

private:
    QSerialPort *m_serial;
    QTimer *m_detectTimer;
    QList<QSerialPortInfo> m_lastPortList;
};

#endif // SERIALPORTWRAPPER_H
